package cn.zjitc.quickstart.controller;

import cn.zjitc.quickstart.controller.vo.UserReqVo;
import cn.zjitc.quickstart.domain.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
public class DemoController {
    @RequestMapping("/index")
    public String index() {
        return "index";
    }
    @RequestMapping("/hello")
    public void hello() {
        System.out.println("hello");
    }
    @RequestMapping("/quick2")
    public ModelAndView quick2(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("username","zjitc");
        mv.setViewName("success");
        return mv;
    }
    @RequestMapping("/quick3")
    public String quick3(Model model){
        model.addAttribute("username","就很烦");
        return "success";

    }
    @RequestMapping("/quick4")
    public String quick4(HttpServletRequest request){
        request.setAttribute("username","zjitc");
        return "success";
    }
    @RequestMapping("/quick5")
    @ResponseBody
    public String quick5(){
        return "hello Spring MVC";
    }
    @RequestMapping("/quick6")
    public void quick6(HttpServletResponse response) throws IOException {
        response.getWriter().write("hello Spring MVC");
    }
    @RequestMapping("/quick7")
    @ResponseBody
    public String quick7(){
        return "{\"username\":\"zhangsan\",\"age\":18}";
    }
    @RequestMapping("/quick8")
    @ResponseBody
    public String quick8() throws JsonProcessingException {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.writeValueAsString(user);
    }
    @RequestMapping("/quick9")
    @ResponseBody
    public User quick9(){
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }

    @RequestMapping("/quick10")
    public void quick10(String name, int age) {
        System.out.println("name:" + name + "age:" + age);
    }

    @RequestMapping("/quick11")
    public void quick11(User user) {
        System.out.println("name:" + user.getName() + "age:" + user.getAge());
    }
    @RequestMapping("/quick12")
    public void quick12(String[] hobby ) {
        System.out.println(Arrays.asList(hobby));
    }


    @RequestMapping("/quick13")
    public void quick13(UserReqVo reqVo) {
        System.out.println(reqVo);
    }

    /**
     * 跳转页面
     * @return
     */
    @RequestMapping("/ajax")
    public String ajax(){
        return "ajax";
    }
    @RequestMapping("/quick14")
    @ResponseBody
    public String quick14(@RequestBody List<User> userList){
        System.out.println(userList);
        return "success";
    }
    /**
     * 接收参数
     * @param username
     */
    @RequestMapping("/quick15")
    @ResponseBody
    public void quick15(@RequestParam(value = "name", required = false,defaultValue = "zjitc") String username){
        System.out.println(username);
    }
    /**
     * 接收参数
     * @param username
     */
    @RequestMapping("/quick16")
    public String quick16(@RequestParam(value = "name", required = false,defaultValue = "zjitc") String username){
        System.out.println(username);
        return "quick16";

    }
    @RequestMapping("/quick17/{name}")
    @ResponseBody
    public void quick17(@PathVariable(value = "name") String username){
        System.out.println(username);
    }
    @RequestMapping("/quick18")
    @ResponseBody
    public void quick18(Date date){
        System.out.println(date);
    }
    @RequestMapping("/quick19")
    @ResponseBody
    public void quick19(HttpServletRequest request, HttpServletResponse response, HttpSession session){
      /*
      `HttpServletRequest request, HttpServletResponse response, HttpSession session` 是 Spring MVC 控制器方法中常用的三个原生 Servlet API 参数，它们分别用于访问 HTTP 请求、响应和会话对象。

### 1. `HttpServletRequest request`
- **用途**：获取客户端发送的 HTTP 请求信息。
- **常见使用场景**：
  - 获取请求参数（如 `request.getParameter("name")`）。
  - 获取请求头（如 User-Agent、Content-Type）。
  - 获取请求的输入流（如上传文件时读取数据）。
  - 获取服务器相关信息（如上下文路径、请求 URL）。

---

### 2. `HttpServletResponse response`
- **用途**：向客户端发送 HTTP 响应。
- **常见使用场景**：
  - 直接写入响应内容（如输出 JSON、HTML、文本等）。
  - 设置响应头或状态码（如设置 `Content-Type` 或 `response.setStatus(201)`）。
  - 实现文件下载（通过 `OutputStream` 输出文件流）。

---

### 3. `HttpSession session`
- **用途**：管理用户的会话状态。
- **常见使用场景**：
  - 存储用户登录信息（如 `session.setAttribute("user", user)`）。
  - 跨请求共享数据（如购物车信息、验证码等）。
  - 控制用户会话生命周期（如注销操作 `session.invalidate()`）。

---

## ✅ 典型应用场景

| 场景 | 使用对象 | 解决的问题 |
|------|----------|-------------|
| 获取请求参数 | `HttpServletRequest` | 获取原始请求中的参数、Header、Cookie 等 |
| 自定义响应输出 | `HttpServletResponse` | 直接输出文件、JSON、图片等非视图内容 |
| 用户身份识别 | `HttpSession` | 在多个请求之间保持用户状态 |
| 文件上传/下载 | `HttpServletRequest`, `HttpServletResponse` | 处理上传文件流、输出文件到浏览器 |
| 安全控制 | `HttpSession` | 判断用户是否已登录、权限控制 |

---

## 🔍 示例代码片段
```java
@RequestMapping("/quick19")
@ResponseBody
public void quick19(HttpServletRequest request, HttpServletResponse response, HttpSession session){
    System.out.println("Request: " + request);
    System.out.println("Response: " + response);
    System.out.println("Session ID: " + session.getId());
}
```


---

## 📝 小结

- **适用场景**：需要直接操作 HTTP 协议细节、处理复杂请求/响应逻辑、维护会话状态。
- **优点**：灵活、功能强大，适合底层控制。
- **缺点**：与 Spring MVC 的注解风格相比略显繁琐，不利于测试和解耦。

如需进一步封装这些对象的使用方式（如使用 `@RequestParam`、`@RequestBody`、`@SessionAttribute`），也可以进行替代以提升开发效率。是否需要我提供替代方案？
       */
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
    }
    @RequestMapping("/quick20")
    @ResponseBody
    public void quick20(@RequestHeader(value = "User-Agent",required = false) String user_agent){
        System.out.println(user_agent);
    }

    @RequestMapping("/quick21")
    public String quick21(String username, MultipartFile uploadFile) {
        System.out.println(username);
        System.out.println(uploadFile);
        try {
            uploadFile.transferTo(new File("D:/upload/" + uploadFile.getOriginalFilename()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "quick21";
    }
    @RequestMapping("/quick22")
    public String quick22(User user,MultipartFile[] uploadFile) throws IOException {
        System.out.println(user);
        if (uploadFile != null){
            for (MultipartFile multipartFile : uploadFile) {
                String originalFilename = multipartFile.getOriginalFilename();
                multipartFile.transferTo(new File("D:/upload/"+originalFilename));
            }
        }
        return "quick22";
    }
    @RequestMapping("/quick23")
    @ResponseBody
    public void quick23(@CookieValue(value = "name") String username){
        System.out.println(username);
    }

}
